(function ($) {
    // 默认参数列表
    var defaults = {
        url: null,
        param: null,
        data: null,
        valueField: 'id',
        textField: 'name',
        defaultValue: "",
        defaultText: "请选择",
        onBeforeLoad: function (param) {
        },
        onLoadSuccess: function () {
        },
        onChange: function (e) {
        }
    };

    // 定义jquery的扩展方法combobox
    $.fn.combobox = function (options, param) {
        //1.将调用时候传过来的参数和default参数合并
        options = $.extend({}, defaults, options || {});

        //2.添加默认值
        var target = $(this);
        target.attr('valuefield', options.valueField);
        target.attr('textfield', options.textField);
        target.empty();

        //3.判断用户传过来的参数列表里面是否包含数据data数据集，如果包含，不用发ajax从后台取，否则否送ajax从后台取数据
        if (options.data) {
            init(target, options.data);
        } else {
            options.onBeforeLoad.call(target, options.param);
            if (!options.url) return;
            $.ajaxSettings.async = false;
            $.getJSON(options.url, options.param, function (res) {
                init(target, res);
            });
        }

        function init(target, data) {
            // 获取默认选中值
            var select = options.select;
            var option;
            if (!select) {
                option = $('<option selected></option>');
            } else {
                option = $('<option></option>');
            }
            option.attr('value', options.defaultValue || '');
            option.text(options.defaultText);
            target.append(option);
            $.each(data, function (i, item) {
                if (select == item[options.textField] || select == item[options.valueField]) {
                    option = $('<option selected></option>');
                } else {
                    option = $('<option></option>');
                }
                option.attr('value', item[options.valueField]);
                option.text(item[options.textField]);
                target.append(option);
            });
            options.onLoadSuccess.call(target);
        }

        // 绑定事件
        target.unbind("change").on("change", options.onChange);
    };
})(jQuery);